﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EF批量添加
{
    class Program
    {
        static void Main(string[] args)
        {
        }
        public class DbContextExtension
        {
            System.Data.Common.DbConnection Connection = null;

            public DbContextExtension(System.Data.Common.DbConnection connection)
            {
                Connection = connection;
            }

            public void BulkInsertAll<T>(IEnumerable<T> entities)  //大数据保存，针对一次插入几千条数据的情况
            {
                entities = entities.ToArray();

                string cs = Connection.ConnectionString;
                var conn = new SqlConnection(cs);
                conn.Open();

                Type t = typeof(T);

                var bulkCopy = new SqlBulkCopy(conn)
                {
                    DestinationTableName = t.Name
                };

                var properties = t.GetProperties().Where(EventTypeFilter).ToArray();
                var table = new DataTable();

                foreach (var property in properties)
                {
                    Type propertyType = property.PropertyType;
                    if (propertyType.IsGenericType &&
                        propertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
                    {
                        propertyType = Nullable.GetUnderlyingType(propertyType);
                    }

                    table.Columns.Add(new DataColumn(property.Name, propertyType));
                }

                foreach (var entity in entities)
                {
                    table.Rows.Add(properties.Select(
                      property => GetPropertyValue(
                      property.GetValue(entity, null))).ToArray());
                }

                bulkCopy.WriteToServer(table);
                conn.Close();
            }

            private bool EventTypeFilter(System.Reflection.PropertyInfo p)
            {
                //var attribute = Attribute.GetCustomAttribute(p,
                //    typeof(AssociationAttribute)) as AssociationAttribute;

                if (attribute == null) return true;
                if (attribute.IsForeignKey == false) return true;

                return false;
            }

            private object GetPropertyValue(object o)
            {
                if (o == null)
                    return DBNull.Value;
                return o;
            }
        }
    }
}
